#include "KamaCoder.h"
using namespace std;

int KamaCoder117::run() {
  // 输入
  int n, m, s, t;
  cin >> n >> m;               // n为文件，m为依赖关系
  vector<int> indegree(n, 0);  // 记录每个节点的入度
  vector<vector<int>> graph(n, vector<int>(0));  // 图的邻接表
  for (int i = 0; i < m; i++) {
    cin >> s >> t;          // 输入依赖关系
    indegree[t]++;          // 记录每个节点的入度
    graph[s].push_back(t);  // 建立图的邻接表
  }
  queue<int> q;                  // 队列
  for (int i = 0; i < n; i++) {  // 遍历每个节点
    if (indegree[i] == 0)        // 如果入度为0，则入队
      q.push(i);
  }

  vector<int> result;              // 存放拓扑排序结果
  vector<bool> visited(n, false);  // 记录每个节点是否访问过
  while (!q.empty()) {             // 队列非空
    int cur = q.front();
    q.pop();                // 取出队首元素
    result.push_back(cur);  // 加入拓扑排序结果
    visited[cur] = true;    // 标记该节点已访问
    // 遍历该节点的邻接表，将其指向的节点入度减1，如果入度为0，则入队
    for (int i = 0; i < graph[cur].size(); i++) {
      int next = graph[cur][i];
      indegree[next]--;
      if (indegree[next] == 0 && !visited[next]) q.push(next);
    }
  }
  if (result.size() != n) {  // 有环
    cout << -1 << endl;
    return 0;
  }
  // 输出拓扑排序结果
  for (int i = 0; i < result.size() - 1; i++) {
    cout << result[i] << " ";
  }

  cout << result[result.size() - 1] << endl;  // 输出最后一个节点

  return 0;
}
